home *** CD-ROM | disk | FTP | other *** search
/ Aminet 48 / Aminet 48 (2002)(GTI - Schatztruhe)[!][Apr 2002].iso / Aminet / dev / src / ggt.lha / ggT / ggtn.adb next >
Encoding:
Text File  |  2002-02-13  |  1.8 KB  |  92 lines

  1. -- ggtn
  2. -- Autor: Norman Walter, Universität Stuttgart
  3. -- Datum: 3.2.2002
  4. -- Berechnet den größten gemeinsamen Teiler (ggT)
  5. -- von n größer oder gleich 2 Zahlen.
  6.  
  7. with text_io,ada.integer_text_io;
  8. use  text_io,ada.integer_text_io;
  9.  
  10. with schlangenpaket;
  11.  
  12. with teiler;
  13. use  teiler;
  14.  
  15. procedure ggtn is
  16.  
  17. package int_schlange is new schlangenpaket(integer);
  18. use int_schlange;
  19.  
  20. stack: schlangen_infos;
  21. x: integer;
  22.  
  23. function ggt_n (FIFO: schlangen_infos) return integer is
  24. -- Berechnet den größten gemeinsamen Teiler von n >= 2 Zahlen.
  25. -- Die Zahlen werden zuvor im FIFO-Speicher abgelegt.
  26. -- Funktion ggt wird überladen.
  27.  
  28. a,b: integer;
  29. stapel: schlangen_infos;
  30.  
  31.  begin
  32.  
  33.   stapel:=FIFO;
  34.  
  35.   loop
  36.  
  37.     -- Zahl a vom Stapel abnehmen.
  38.     pop(stapel,a);
  39.  
  40.     -- Prüfen, ob es das letzte Element war.
  41.     -- Wenn ja, springe aus der Schleife.
  42.     -- Der ggT von allen Zahlen steht dann in der Variable a.
  43.  
  44.     exit when schlange_leer(stapel);
  45.  
  46.     -- Zahl b vom Stapel abnehmen.
  47.     pop(stapel,b);
  48.  
  49.     -- Größten gemeinsamen Teiler von a und b auf den Stapel legen.
  50.     -- Achtung: Dies ist keine Rekursion. Es wird vielmehr die
  51.     -- Funktion ggt(a,b) für zwei Elemente zur Berechnung herangezogen.
  52.  
  53.     push(stapel,ggt(a,b));
  54.  
  55.   end loop;
  56.  
  57.   -- Gebe den ggT von allen zahlen zurück.
  58.  
  59.   return a;
  60.  
  61. end ggt_n;
  62.  
  63.  
  64. begin
  65.  
  66.  put("Berechnet den größten gemeinsamen Teiler von n > 1 Zahlen.");
  67.  new_line;
  68.  put("Eingabe von 0 beendet die Eingabe");
  69.  new_line;
  70.  
  71.  loop
  72.  
  73.    put("Zahl=");
  74.    get(x);
  75.  
  76.    -- Gibt der Benutzer 0 ein, wird die Eingabeschleife beendet.
  77.    -- Alle Zahlen, von denen der ggT gebildet werden soll,
  78.    -- liegen dann auf dem Stack.
  79.  
  80.    exit when x=0;
  81.  
  82.    -- Zahl auf den Stack legen
  83.  
  84.    push(stack,x);
  85.  
  86.  end loop;
  87.  
  88.    put("Größter gemeinsamer Teiler: ");
  89.    put(ggt_n(stack),0);
  90.  
  91. end ggtn;
  92.